#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
//例子：
//第一步：打开当前路径下的file.txt文件，如果不存在就创建，写入"hello txt"
//第二步：从文件当中读取内容并打印到标准输出，最后关闭文件流指针

//细节：当向文件中写入数据后，想要在文件开头读取数据(此时文件指针已经不在开头了)
//方法1：需要关闭文件重新打开，方法2：让文件指针跳转到文件起始位置,然后再开始读取文件数据

#if 0
int main()
{
    FILE* fp = fopen("./file.txt","wb+");//注意！！！这里的打开模式为wb+ 否则会出错误！！！
    if(NULL == fp)
    {
        perror("fopen:");
        exit(1);
    }
    //fseek(文件指针，相对于第三个参数的偏移量，位置) -更改文件指针的指向
    //fwrite(要写入的内容，输出数据的元素个数，每个元素的大小，文件指针)-向二进制文件当中写入
    //fread(读取到哪里，要读取的每个元素的大小，读取的个数，文件指针)-从二进制文件当中读取
    fseek(fp,0,SEEK_SET);//让文件指针回到文件的起始位置
    const char* str = "hello txt";
    size_t n = fwrite(str,1,strlen(str),fp);  //注意：\0不写入  n:成功写入的元素个数
    if(n != strlen(str))
    {
        perror("fwrite:");
        exit(1);
    }
    fseek(fp,0,SEEK_SET);//让文件指针回到文件的起始位置
    char buf[1024] = {0};//保存从文件中读取的数据
    n = fread(buf,1,1023,fp); //n ：返回实际读取的元素个数
    if(n == 0)
    {
        if(ferror(fp)) //判断是否遇到了错误导致结束
            printf("fread error\n");
        if(feof(fp))//判断是否遇到了文件结尾导致结束
            printf("read end of file\n");
        return -1;
    }
    printf("%s\n",buf);
    fclose(fp);//记得要关闭文件指针
    return 0;
}
#endif
//
#if 0
int main()
{
    FILE* fp = fopen("./file.txt","r");
    fseek(fp,0,SEEK_END);
    long size = ftell(fp); 
    printf("%ld\n",size);//此时文件内容为：hello txt\0  输出为9  即文件尾指针指向\0位置
    return 0;
}
#endif
//另类的确定开辟多大的空间保存内容
/*
fseek(fp,0,SEEK_SET);//先让文件指针回到开头
fseek(fp,0,SEEK_END);//让文件指针跳到结尾位置
long size = ftell(fp);//得出当前文件指针离开头的位置 ->就知道有多少个字符了
fseek(fp,0,SEEK_SET);
char* buf = (char*)malloc(size + 1);
*/

//重写
const char* path = "./file.txt";
int main()
{
    FILE* fp = fopen(path,"wb");//以二进制方式写入
    if(NULL == fp)
    {
        perror("fopen:");
        exit(1);
    }
    const char* str = "hello I am file.txt";
    fseek(fp,0,SEEK_SET);
    size_t n = fwrite(str,1,strlen(str),fp);//写入的每个元素大小为1个字节,共写入strlen(str)个元素
    if(n != strlen(str)) //返回值：实际写入的元素个数
    {
        perror("fwrite:");
        exit(2);
    }
    fclose(fp);//关闭文件流指针，恢复文件指针的指向  若放到最后再fclose(fp)会导致下面read end of file
    FILE* rp = fopen(path,"rb+");//以二进制读取方式打开
    if(rp == NULL)
    {
        perror("fopen:");
        exit(3);
    }
    #define NUM 1024
    char buff[NUM] = {0};
    n = fread(buff,1,NUM-1,rp);//每个元素大小为1个字节，期望读取NUM-1个元素
    if(n == 0) //返回实际读取的元素个数
    {
        if(ferror(rp))
            printf("fread error\n");
        if(feof(rp))
            printf("read end of file\n");
        exit(3);
    }
    printf("read content:%s\n",buff);
    //最后需要关闭这两个文件流指针
    
    fclose(rp);
    return 0;
}
